import java.util.*;

/*
Kruskal求最小生成树
给定一个 n个点 m条边的无向图，图中可能存在重边和自环，边权可能为负数。
求最小生成树的树边权重之和，如果最小生成树不存在则输出 impossible。
给定一张边带权的无向图 G=(V,E)，其中 V 表示图中点的集合，EE 表示图中边的集合，n=|V|，m=|E|。
由 V中的全部 n个顶点和 E中 n−1 条边构成的无向连通子图被称为 G的一棵生成树，其中边的权值之和最小的生成树被称为无向图 G的最小生成树。

输入格式
第一行包含两个整数 n和 m。
接下来 m行，每行包含三个整数u,v,w，表示点 u和点 v之间存在一条权值为 w的边。

输出格式
共一行，若存在最小生成树，则输出一个整数，表示最小生成树的树边权重之和，如果最小生成树不存在则输出 impossible。

数据范围
1≤n≤1e5,1≤m≤2∗1e5,
图中涉及边的边权的绝对值均不超过 1000。

输入样例：
4 5
1 2 1
1 3 2
1 4 3
2 3 2
3 4 4

输出样例：
6
 */
public class Main {
    static int n, m, sum;

    static class Edge {
        int u, v, w;

        public Edge(int _u, int _v, int _w) {
            u = _u;
            v = _v;
            w = _w;
        }
    }

    static Edge[] edges;
    static int[] p;

    static int find(int u) {
        if (u != p[u]) p[u] = find(p[u]);
        return p[u];
    }

    static boolean kruskal() {
        int count = 0;//统计边数
        for (int i = 1; i <= m; i++) {
            int u = edges[i].u, v = edges[i].v, w = edges[i].w;
            if (find(u) != find(v)) {
                count++;
                sum += w;
                p[find(u)] = find(v);
            }
        }
        return count == n - 1;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        p = new int[n + 1];
        for (int i = 1; i <= n; i++) p[i] = i;
        edges = new Edge[m + 1];
        for (int i = 1; i <= m; i++) {
            int u = sc.nextInt(), v = sc.nextInt(), w = sc.nextInt();
            edges[i] = new Edge(u, v, w);
        }
        Arrays.sort(edges, 1, m, (a, b) -> Integer.compare(a.w, b.w));
        if (kruskal()) System.out.println(sum);
        else System.out.println("impossible");
    }
}